/**
 * 文件名称: gpio.h
 * 摘    要: linux应用程序下操作gpio接口头文件
 * 来    源: 参考 http://bbs.myir-tech.com/thread-7183-1-1.html
 *
 * 当前版本: 1.0 
 * 作    者: huenrong
 * 完成日期: 2019年05月12日
 **/


#ifndef __GPIO_H
#define __GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

// 定义gpio的方向
#define     IN                  0
#define     OUT                 1


/************************************************************************
函数名称: gpio_export
函数功能: 导出gpio到用户空间
函数参数: gpio: 需要导出的gpio编号
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_export(const unsigned int gpio);

/************************************************************************
函数名称: gpio_unexport
函数功能: 取消导出到用户空间的gpio
函数参数: gpio: 导出的gpio编号
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_unexport(const unsigned int gpio);

/************************************************************************
函数名称: gpio_set_direction
函数功能: 设置gpio方向
函数参数: gpio: 导出的gpio编号
          out_flag: 输入/输出标志(0: in, 1: out)
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_set_direction(const unsigned int gpio, const int out_flag);

/************************************************************************
函数名称: gpio_set_value
函数功能: 设置gpio输出电平值
函数参数: gpio: 导出的gpio编号
          gpio_value: gpio的值(只能是0或者1)
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_set_value(const unsigned int gpio, const unsigned int gpio_value);

/************************************************************************
函数名称: gpio_get_value
函数功能: 获取gpio的电平值
函数参数: gpio: 导出的gpio编号
          gpio_value: 获取到的gpio电平值(正常情况是0或者1, 若获取到的值错误, 则是2)
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_get_value(const unsigned int gpio, unsigned int *gpio_value);

/************************************************************************
函数名称: gpio_set_edge
函数功能: 设置触发中断的边沿
函数参数: gpio: 需要设置的的gpio编号
          edge: 中断触发边沿(可选值: "none", "rising", "falling", "both")
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_set_edge(const unsigned int gpio, const char *edge);

/************************************************************************
函数名称: gpio_fd_open
函数功能: 打开gpio设备并返回文件描述符
函数参数: gpio: gpio编号
函数返回: 成功: 返回文件描述符
          失败: 返回-1
************************************************************************/
int gpio_fd_open(const unsigned int gpio);

/************************************************************************
函数名称: gpio_fd_open
函数功能: 关闭gpio设备
函数参数: fd: gpio文件描述符
函数返回: 0: 成功
          -1: 失败
************************************************************************/
int gpio_fd_close(const int fd);


#ifdef __cplusplus
}
#endif

#endif /* __GPIO_H */

